package com.skh.array;

/**
 * 重塑矩阵
 * created by skh on 2018/8/19
 */
public class ReshapeTheMatrix {

	/*
	在MATLAB中，有一个非常有用的函数 reshape，它可以将一个矩阵重塑为另一个大小不同的新矩阵，但保留其原始数据。

	给出一个由二维数组表示的矩阵，以及两个正整数r和c，分别表示想要的重构的矩阵的行数和列数。

	重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。

	如果具有给定参数的reshape操作是可行且合理的，则输出新的重塑矩阵；否则，输出原始矩阵。

	示例 1:

	输入:
	nums =
	[[1,2],
	 [3,4]]
	r = 1, c = 4
	输出:
	[[1,2,3,4]]
	解释:
	行遍历nums的结果是 [1,2,3,4]。新的矩阵是 1 * 4 矩阵, 用之前的元素值一行一行填充新矩阵。
	示例 2:

	输入:
	nums =
	[[1,2],
	 [3,4]]
	r = 2, c = 4
	输出:
	[[1,2],
	 [3,4]]
	解释:
	没有办法将 2 * 2 矩阵转化为 2 * 4 矩阵。 所以输出原矩阵。
	 */


	/*
	这题其实可以理解成就是一维数组的复制，只需要跟着index走就好了，只不过这里index的取值范围是[0, r*c)而已。
	那么怎么根据index得到实际在二维数组中的位置呢，也很容易，就是(index / c, index % c)。
	 */
	public int[][] matrixReshape(int[][] nums, int r, int c) {
		int origin_r = nums.length; //原来的行
		int origin_c = nums[0].length; //原来的列

		if (r * c != origin_c * origin_r) {
			return nums;
		}

		int[][] rs = new int[r][c];
		for (int i=0;i<r*c;i++) {
			rs[i / c][i % c] = nums[i / origin_c][i % origin_c];
		}

		return rs;

	}
}
